#ifndef MDCODE_H
#define MDCODE_H

#include "treeParse.h"

typedef  enum
{ ADD , SUB , MULT ,DIV , EQC ,LTC,
  READC, WRITEC ,RETURNC ,ASSIG,AADD ,LABEL,
  JUMP0, JUMP ,CALL, VARACT ,VALACT,
  PENTRY , ENDPROC, MENTRY,WHILESTART,ENDWHILE
}  CodeKind ;

/*ARG结构分为：标号，数值，地址三种*/
typedef  enum { LabelForm , ValueForm , AddrForm }  ArgForm ;

/*变量的类别。dir表直接变量(值参)，indir表示间接变量(变参)*/
typedef  enum    {dir,indir}AccessKind;

/*定义ARG结构*/
typedef struct
{  ArgForm   form ;
   union
    {   int  value ;  /*纪录整数值*/
        int  label ;  /*纪录标号的值*/
        struct
        {   char    name[10] ;	/*注：变量名字已经没用，这里保留只是为了显示结果清晰*/
            int     dataLevel ;
            int     dataOff ;
            AccessKind  access ; /*类型AccessKind在前面定义*/
        }addr;   /*变量的ARG结构需要纪录的信息*/
   }Attr ;
} ArgRecord;

/*中间代码的结构*/
typedef struct
{    CodeKind   codekind;
     ArgRecord  *arg1;  /*以后考虑这里是用指针好，还是直接用
                          ArgRecord类型的变量好*/
     ArgRecord  *arg2;
     ArgRecord  *arg3;
} CodeR;

typedef  struct  codeFile
{   CodeR  codeR;
    struct codeFile  *former;
    struct codeFile  *next ;
} CodeFile ;

CodeFile  *GenMidCode(TreeNode *t,int StoreNoff);
void GenProcDec(TreeNode *t);
int  NewLabel();

#endif // MDCODE_H
